<template><div><h2 id="请求生命周期" tabindex="-1"><a class="header-anchor" href="#请求生命周期"><span>请求生命周期</span></a></h2>
<h2 id="静态结构" tabindex="-1"><a class="header-anchor" href="#静态结构"><span>静态结构</span></a></h2>
<p>Yii 应用参照 <a href="http://wikipedia.org/wiki/Model-view-controller" target="_blank" rel="noopener noreferrer">模型-视图-控制器（MVC）</a>设计模式来组织。<a href="https://learnku.com/docs/yii-framework/2.0.x/models/12003" target="_blank" rel="noopener noreferrer">模型</a> 代表数据、业务逻辑和规则；<a href="https://learnku.com/docs/yii-framework/2.0.x/views/12005" target="_blank" rel="noopener noreferrer">视图</a> 展示模型的输出；<a href="https://learnku.com/docs/yii-framework/2.0.x/controller/12002" target="_blank" rel="noopener noreferrer">控制器</a> 接受出入并将其转换为模型和视图命令。</p>
<p>除了 MVC, Yii 应用还有以下部分：</p>
<ul>
<li><a href="https://learnku.com/docs/yii-framework/2.0.x/entry-script/11999" target="_blank" rel="noopener noreferrer">入口脚本</a>：终端用户能直接访问的 PHP 脚本， 负责启动一个请求处理周期。</li>
<li><a href="https://learnku.com/docs/yii-framework/2.0.x/application-subject/12000" target="_blank" rel="noopener noreferrer">应用</a>：能全局范围内访问的对象， 管理协调组件来完成请求.</li>
<li><a href="https://learnku.com/docs/yii-framework/2.0.x/application-component/12001" target="_blank" rel="noopener noreferrer">应用组件</a>：在应用中注册的对象， 提供不同的功能来完成请求。</li>
<li><a href="https://learnku.com/docs/yii-framework/2.0.x/modules/12006" target="_blank" rel="noopener noreferrer">模块</a>：包含完整 MVC 结构的独立包， 一个应用可以由多个模块组建。</li>
<li><a href="https://learnku.com/docs/yii-framework/2.0.x/filters/12007" target="_blank" rel="noopener noreferrer">过滤器</a>：控制器在处理请求之前或之后 需要触发执行的代码。</li>
<li><a href="https://learnku.com/docs/yii-framework/2.0.x/widgets/12020" target="_blank" rel="noopener noreferrer">小部件</a>：可嵌入到视图中的对象， 可包含控制器逻辑，可被不同视图重复调用。</li>
</ul>
<p>下面的示意图展示了 Yii 应用的静态结构：</p>
<p><img src="https://cdn.learnku.com/uploads/images/202201/27/93088/YyPT9q9X5Y.png!large" alt="Yii应用静态结构"></p>
<h2 id="生命周期" tabindex="-1"><a class="header-anchor" href="#生命周期"><span>生命周期</span></a></h2>
<p>每一次 Yii 应用开始处理 HTTP 请求时，它都会进行一个近似的流程。</p>
<ol>
<li>用户提交指向 <a href="https://github.com/yiisoft/yii2/blob/master/docs/guide-zh-CN/structure-entry-scripts.md" target="_blank" rel="noopener noreferrer">入口脚本</a> <code v-pre>web/index.php</code> 的请求。</li>
<li>入口脚本会加载 <a href="https://github.com/yiisoft/yii2/blob/master/docs/guide-zh-CN/concept-configurations.md" target="_blank" rel="noopener noreferrer">配置数组</a> 并创建一个 <a href="https://github.com/yiisoft/yii2/blob/master/docs/guide-zh-CN/structure-applications.md" target="_blank" rel="noopener noreferrer">应用</a> 实例用于处理该请求。</li>
<li>应用会通过 <a href="https://github.com/yiisoft/yii2/blob/master/docs/guide-zh-CN/runtime-requests.md" target="_blank" rel="noopener noreferrer">request（请求）</a> 应用组件 解析被请求的 <a href="https://github.com/yiisoft/yii2/blob/master/docs/guide-zh-CN/runtime-routing.md" target="_blank" rel="noopener noreferrer">路由</a>。</li>
<li>应用创建一个 <a href="https://github.com/yiisoft/yii2/blob/master/docs/guide-zh-CN/structure-controllers.md" target="_blank" rel="noopener noreferrer">controller（控制器）</a> 实例具体处理请求。</li>
<li>控制器会创建一个 <a href="https://github.com/yiisoft/yii2/blob/master/docs/guide-zh-CN/structure-controllers.md" target="_blank" rel="noopener noreferrer">action（动作）</a> 实例并为该动作执行相关的 Filters（访问过滤器）。</li>
<li>如果任何一个过滤器验证失败，该动作会被取消。</li>
<li>如果全部的过滤器都通过，该动作就会被执行。</li>
<li>动作会加载一个数据模型，一般是从数据库中加载。</li>
<li>动作会渲染一个 View（视图），并为其提供所需的数据模型。</li>
<li>渲染得到的结果会返回给 <a href="https://github.com/yiisoft/yii2/blob/master/docs/guide-zh-CN/runtime-responses.md" target="_blank" rel="noopener noreferrer">response（响应）</a> 应用组件。</li>
<li>响应组件会把渲染结果发回给用户的浏览器。</li>
</ol>
<p>下面的示意图展示了应用是如何处理一个请求的。</p>
<p><img src="https://cdn.learnku.com/uploads/images/202201/30/93088/eCjBmHinCW.png!large" alt="请求生命周期"></p>
<p>在这个版块中，我们会更加详细地描述某些步骤的具体运作。</p>
<blockquote>
<p>💖喜欢本文档的，欢迎点赞、收藏、留言或转发，谢谢支持！<br>
作者邮箱：zhuzixian520@126.com，github地址：<a href="https://github.com/zhuzixian520" target="_blank" rel="noopener noreferrer">github.com/zhuzixian520</a></p>
</blockquote>
</div></template>


